package vip.zhenzicheng.jpa.base;


import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import java.util.List;


/**
 * 公共查询服务接口，所有的service接口都应该实现
 *
 * @author zhenzicheng
 * @date 2023-04-17 16:36
 */
public interface BaseService<T extends BaseAuditEntity, ID extends Number> {

    /**
     * 新增或编辑
     *
     * @param t
     * @return
     */
    T saveOrUpdate(T t);

    /**
     * 批量新增或编辑
     *
     * @param var1
     * @return
     */
    List<T> saveAll(Iterable<T> var1);

    /**
     * 根据id查询
     *
     * @param id
     * @return
     */
    T findById(ID id);

    /**
     * 根据id删除
     *
     * @param id
     */
    void deleteById(ID id);

    /**
     * 根据id列表批量删除
     *
     * @param idList
     */
    void deleteAllByIdInBatch(Iterable<ID> idList);

    /**
     * 根据id列表批量删除，通过级联关系Repository.deleteBy()会把子表关系删除
     * Repository.deleteAllByIdInBatch() 会报错
     *
     * @param idList id列表
     * @return void
     * @create 2022/3/24
     */
    void cascadeDeleteAllByIdInBatch(Iterable<ID> idList);

    /**
     * 删除所有
     */
    void deleteAll();

    /**
     * 查询所有
     *
     * @return
     */
    List<T> findAll();

    /**
     * 分页查询
     *
     * @param pageable
     * @return
     */
    Page<T> findAll(Pageable pageable);

    /**
     * 批量删除
     *
     * @param var1
     */
    void deleteAllInBatch(Iterable<T> var1);
}
